正则篇(一):认识正则表达式
这篇文档关于正则都使用方法和技巧,主要面向文科小白,如果你是IT大佬,请移步~
先说好,我不是程序猿/媛。推荐正则不是让大家写代码,纯粹是为了让大家在翻译时能提高效率。(反正正则就是谁用谁说好~)
正则是个什么鬼?
我们看看正则是怎么定义的:
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
听不懂,先放放定义。没关系,定义不重要,有啥作用和咋用比较重要。请继续。
为啥用正则?
第一,当然是为了提高搜索效率。
比如,你可能通过正则搜索以下场景:
在一个文件中,你想搜索“cat”这个词,但不搜索含有cat这个单词的其它词,如catalogue、cataract、catch等类似的词;
你收集了一些用户信息,其中包含:中文姓名、联系电话、电子邮件等,那你可能希望检查用户填写的信息是否符合标准,那你就可以试试搜索“手机号为1开头的11位数字”;
收到译文后,你想看看译员翻译的日期到底对不对,那你可能会搜索一下日期,是不是格式一致;
还有你可能会想看看有没有两个连续空格啊,特殊符号啊等等。
第二,反正搜索有时候就是为了替换的嘛,所以用正则也是为了提高替换的效率。
在一个文件中,你想把“size”替换为“isize”,但不替换含有size的其它词,如oversize等类似的词;
在进行网站英译汉本地化的过程中,原文中的超链接网址都会变为标签,所以你可能希望把所有的标签网址中的en替换为zh;
等等。
总之,只要你觉得搜起来/替换起来很麻烦的,想搜但搜不到的,正则都能帮你。
正则适用于谁?
不论你是译员or项目经理or质检人员,只要你想借助CAT工具让翻译和项目管理效率更快一点or质量更高一点,欢迎一起来用;
如果你借助office让效率更快一点,欢迎一起来和正则的好朋友(哈哈,就是“通配符”)一起玩(通配符以后再讲);
如果你是程序猿/媛,欢迎来补充or更正~
新手入门
如果你是小白,那你需要先了解以下几个符号和表达。
⚠️以下所有的符号都是英文标点下的,一个符号即一个字符哦!
点、星号、加号和问号
.(点)可以匹配任意单个字符。意思就是,只要是一个字符,就能搜出来。比如,如果我搜索 c.t
,那我搜出来的结果可能有:cat
、 cbt
、 cct
、 cdt
、 c0t
、 cAt
、等等。-----只要包含c什么什么t的都会被搜出来。
*(星号)可以匹配内容的零项、一项或者多项。意思就是:我不管有没有,麻烦都帮我找一下。比如,如果我搜索 c.*t
,那我搜出来的结果可能有:cat
、 caat
、 caaaaaat
、 ct
等等。你看,c和t之间可能啥也没有,所以 ct
也会被搜出来。
+(加号)可以匹配内容的一项或者多项。意思就是,我知道肯定有,但是我不知道有几个这样的。比如,如果我搜索 c.+t
,那我搜出来的结果可能有:cat
、 cbbbt
、 ccct
、 c0t
、 cAAt
、等等, 但是ct
就不会被搜出来。
?(问号)可以匹配内容的零项或者一项。意思就是,我不知道有没有,如果没有就算惹;如果有麻烦帮我只匹配有一次的内容。比如,如果我搜索 c.?t
,那我搜出来的结果可能有:cat
、 cbt
、 cct
、 ct
等等,像 caat
就不会被搜出来。
^开头和$结尾
做事情都讲究有始有终,使用正则也是一样的嘛~ 要想好从哪里开始搜索,和搜到哪里结束。
从哪里开始用 ^
(插入符号,同时按下键盘的 shift+数字6
),从哪里结束用 $
(美元符号,同时按下键盘的 shift+数字4
)。
举个例子🌰
我想搜索1开头的任意内容,那我就可以使用 ^1.+
。这时候你可能会搜出来 12340
, 18293274
, 1是一个数字
等等,只要是数字1开头,一直到段落结束的所有内容都会被搜出来。
\ 反斜线,转义符
转义转义,帮忙转换一下意义。比如说,本来在正则中, .
表示匹配任意字符,如果是 \.
(在点前面加了个转义符),就表示匹配小数点,而不是匹配任意字符啦~
再比如说, +
表示匹配任意字符,如果是 \+
(在加号前面加了个转义符),就表示匹配加号,而不是匹配一个或多个内容啦~
下次如果你也不知道到底有没有含义,可以试试在前面加一个转义符号。
常用的带转义符的正则公式有:
\s
表示匹配空格
\d
表示匹配数字
\n
表示匹配换行符
\r
表示匹配回车符
\t
表示匹配tab字符
字符集
字符集用[ ]
(英文的中括号对)表示。我记得小时候,也不是小时候,好像是初高中吧,学“集合”,就是用的这个东西。数学中集合具有某种特定性质的具体的或抽象的对象汇总而成的集体,这里的含义和数学上那个是一样的。简单理解,就是一类字符。理解不了可以往下看看例子。
常见的字符集有:
[A-Za-z0-9]
表示匹配任意大小写字母和单个数字[a-z]
表示匹配a至z之间的一个小写英文字母[A-Z]
表示匹配A至Z之间的一个大写英文字母[0-9]
表示匹配0至9之间的一个数字[\u4e00-\u9fa5]
表示匹配中文字符
当然,也可以进行组合,比如说:
[a-zA-Z0-9_\u4e00-\u9fa5]+
表示匹配至少一个汉字、数字、字母、下划线
匹配重复次数
如果想设置一个精确匹配的次数,就可以用 {}
(英文的大括号对)表示。比如,如果搜索 c.{3}t
,那么就只能搜出 caaat
、 cbbbt
、 chhht
等等,只有c和t中间有3个字符的,才会被匹配出来。
再比如,如果搜索 c.{3,5}t
,那么就只能搜出 caaat
、 caaaat
、 caaaaat
等等,只有c和t中间有3-5个字符的,才会被匹配出来。
总结
回顾一下这篇文档的内容:
正则表达式是什么
正则表达式的作用
正则的常用场景和匹配表达
利用
点、星号、加号和问号
匹配任意字符的零项、一项或多项利用
^
和$
匹配开头和结尾转义符的用法
一些字符集及其组合
匹配重复次数
练习一下~
理论得结合实践,光看不行可以练一下~
我经常会用memoQ的正则过滤器测试,不过网上也有很多可以测试正则的网址,比如,你可以戳这里(https://tool.oschina.net/regex),自己造点文本练习一下,你也可以用以下文本拿去测试。
(答案都给出了,没有道理再偷懒咯~)
日期 | 匹配规则 |
2018-06-25 | \d+-\d+-\d+ |
06/25/2018 | \d+/\d+/\d+ |
2018年06月25日 | \d+年\d+月\d+日 |
2018年06月25日 | \d+年\d+月\d+日 |
至于为什么这样匹配~交给你想一下啦~当然如果你有其它匹配规则,po出来我们一起讨论~
其实写这篇帖子最终的目的不是要求大家一定要成为一个很牛掰的用正则的人,而是希望引入一个提高翻译和项目管理效率的方法:
下次想查找替换的时候,或者想要处理什么文本的时候,可以考虑用正则表达式呢~说不定会有帮助的。
如果不会用,“百度一下”也是OK的啦~比如,百度一下“中文 正则”,也是可以的呀~(反正我也老这么干嘻嘻😁)
但是一定要先想着用才行~
好啦这期正则篇先到这里,下期分享“如何写一个正则表达式”。
你还想了解什么,欢迎来问呀~